# config.py - 配置文件
"""
CSV数据集处理和上传配置文件
用户可以根据需要修改以下设置
"""

import os

# =============================================================================
# 文件路径配置
# =============================================================================

# CSV文件路径 - 可以是单个文件路径或包含CSV文件的目录路径
CSV_PATH = "raw"

# 是否递归搜索子目录中的CSV文件（仅当CSV_PATH为目录时生效）
RECURSIVE_SEARCH = False

# 是否自动检测CSV分隔符（如果为True，会忽略CSV_DELIMITER设置）
AUTO_DETECT_DELIMITER = False

# =============================================================================
# CSV文件格式配置
# =============================================================================

# CSV分隔符
# 常用值：
# - "," 逗号分隔（默认）
# - "\t" 制表符分隔
# - ";" 分号分隔
CSV_DELIMITER = ","

# CSV文件编码（通常不需要修改）
CSV_ENCODING = "utf-8"

# =============================================================================
# 数据处理配置
# =============================================================================

# 图片列名（包含base64编码图片数据的列）
IMAGE_COLUMN = "image"

# 需要转换为整数类型的列名列表
INTEGER_COLUMNS = ["annotation_id", "annotator", "id"]

# 需要转换为浮点数类型的列名列表
FLOAT_COLUMNS = ["lead_time"]

# 需要保持为字符串类型的列名列表
STRING_COLUMNS = ["created_at", "phenology", "updated_at"]

# =============================================================================
# Hugging Face Hub配置
# =============================================================================

# Hub仓库名（格式：用户名/仓库名）
HUB_REPO = "kunpehx/plum_phenological_period1"

# 数据集分片大小（控制上传文件大小）
MAX_SHARD_SIZE = "200MB"

# 是否设为私有仓库
PRIVATE_REPO = False

# =============================================================================
# 输出和日志配置
# =============================================================================

# 是否显示详细处理信息
VERBOSE = True

# 是否显示数据集第一条记录的图片信息
SHOW_FIRST_IMAGE = True

# 是否在处理过程中显示进度
SHOW_PROGRESS = True

# =============================================================================
# 高级配置（通常不需要修改）
# =============================================================================

# 数据集特征定义
DATASET_FEATURES = {
    "annotation_id": "int64",
    "annotator": "int64",
    "created_at": "string",
    "id": "int64",
    "image": "image",  # 特殊类型，会被转换为Image()
    "lead_time": "float64",
    "phenology": "string",
    "updated_at": "string",
}

# base64图片数据前缀处理
# 如果图片数据包含"data:image/xxx;base64,"前缀，设置为True
STRIP_DATA_PREFIX = True

# 错误处理策略
# "strict": 遇到错误立即停止
# "skip": 跳过有错误的文件继续处理
# "warn": 显示警告但继续处理
ERROR_HANDLING = "skip"

# =============================================================================
# 网络和上传配置
# =============================================================================

# 网络重试配置
NETWORK_MAX_RETRIES = 5  # 最大重试次数
NETWORK_BASE_DELAY = 2.0  # 基础延迟时间（秒）
NETWORK_MAX_DELAY = 120.0  # 最大延迟时间（秒）
NETWORK_BACKOFF_FACTOR = 2.5  # 退避因子
NETWORK_ENABLE_JITTER = True  # 启用随机抖动

# 连接超时设置
CONNECTION_TIMEOUT = 300  # 连接超时时间（秒）
READ_TIMEOUT = 600  # 读取超时时间（秒）

# 上传优化
UPLOAD_CHUNK_SIZE = 8388608  # 8MB 上传块大小
ENABLE_UPLOAD_PROGRESS = True  # 显示上传进度
PRE_UPLOAD_NETWORK_CHECK = True  # 上传前网络检查

# 代理设置（如果需要）
USE_PROXY = False  # 是否使用代理
PROXY_HTTP = None  # HTTP代理地址，如 "http://proxy.example.com:8080"
PROXY_HTTPS = None  # HTTPS代理地址

# =============================================================================
# 新增实用功能配置
# =============================================================================

# 是否在处理前分析CSV文件结构
ANALYZE_CSV_STRUCTURE = True

# 是否验证多个CSV文件的一致性
VALIDATE_CSV_CONSISTENCY = True

# 是否生成处理报告
GENERATE_REPORT = True

# 报告保存路径
REPORT_OUTPUT_PATH = "reports/processing_report.txt"

# 是否创建配置备份
BACKUP_CONFIG = True

# 备份目录
BACKUP_DIR = "backups"

# 是否显示数据集预览
SHOW_DATASET_PREVIEW = True

# 预览记录数量
PREVIEW_SAMPLE_SIZE = 3

# 是否估算处理时间
ESTIMATE_PROCESSING_TIME = True

# 是否自动清理临时文件
AUTO_CLEANUP_TEMP = True

# 临时文件最大保存时间（小时）
TEMP_FILE_MAX_AGE_HOURS = 24

# 临时文件目录
TEMP_DIR = "temp"

# =============================================================================
# 环境检查和配置验证
# =============================================================================

def validate_config():
    """验证配置是否有效"""
    errors = []
    warnings = []

    # 检查CSV路径
    if not CSV_PATH:
        errors.append("CSV_PATH不能为空")
    elif not (os.path.isfile(CSV_PATH) or os.path.isdir(CSV_PATH)):
        errors.append(f"CSV_PATH指定的路径不存在: {CSV_PATH}")

    # 检查Hub仓库名格式
    if not HUB_REPO or "/" not in HUB_REPO:
        errors.append("HUB_REPO必须是'用户名/仓库名'格式")

    # 检查必要的列配置
    if IMAGE_COLUMN not in DATASET_FEATURES:
        errors.append(f"图片列'{IMAGE_COLUMN}'未在DATASET_FEATURES中定义")

    # 检查报告输出目录
    if GENERATE_REPORT:
        report_dir = os.path.dirname(REPORT_OUTPUT_PATH)
        if report_dir and not os.path.exists(report_dir):
            warnings.append(f"报告输出目录不存在，将自动创建: {report_dir}")

    # 检查备份目录
    if BACKUP_CONFIG and not os.path.exists(BACKUP_DIR):
        warnings.append(f"备份目录不存在，将自动创建: {BACKUP_DIR}")

    # 检查临时目录
    if AUTO_CLEANUP_TEMP and not os.path.exists(TEMP_DIR):
        warnings.append(f"临时目录不存在: {TEMP_DIR}")

    # 检查预览样本数量
    if PREVIEW_SAMPLE_SIZE < 1:
        warnings.append("PREVIEW_SAMPLE_SIZE应该大于0")

    # 检查网络配置
    if NETWORK_MAX_RETRIES < 0:
        errors.append("NETWORK_MAX_RETRIES不能小于0")

    if NETWORK_BASE_DELAY < 0:
        errors.append("NETWORK_BASE_DELAY不能小于0")

    if CONNECTION_TIMEOUT < 30:
        warnings.append("CONNECTION_TIMEOUT小于30秒可能导致上传失败")

    if USE_PROXY and not (PROXY_HTTP or PROXY_HTTPS):
        warnings.append("启用了代理但未配置代理地址")

    return errors, warnings

def get_config_summary():
    """获取配置摘要信息"""
    return {
        "csv_path": CSV_PATH,
        "recursive_search": RECURSIVE_SEARCH,
        "auto_detect_delimiter": AUTO_DETECT_DELIMITER,
        "csv_delimiter": repr(CSV_DELIMITER),
        "hub_repo": HUB_REPO,
        "error_handling": ERROR_HANDLING,
        "analyze_structure": ANALYZE_CSV_STRUCTURE,
        "validate_consistency": VALIDATE_CSV_CONSISTENCY,
        "generate_report": GENERATE_REPORT,
        "estimate_time": ESTIMATE_PROCESSING_TIME,
        "network_retries": NETWORK_MAX_RETRIES,
        "connection_timeout": CONNECTION_TIMEOUT,
        "use_proxy": USE_PROXY,
    }

if __name__ == "__main__":
    # 运行配置验证
    errors, warnings = validate_config()

    print("=" * 50)
    print("配置验证结果")
    print("=" * 50)

    if errors:
        print("❌ 配置验证失败:")
        for error in errors:
            print(f"   - {error}")
    else:
        print("✅ 配置验证通过!")

    if warnings:
        print("\n⚠️  配置警告:")
        for warning in warnings:
            print(f"   - {warning}")

    if not errors:
        print(f"\n📋 配置摘要:")
        summary = get_config_summary()
        for key, value in summary.items():
            print(f"   {key}: {value}")

        print(f"\n🎯 主要功能:")
        features = []
        if ANALYZE_CSV_STRUCTURE:
            features.append("结构分析")
        if VALIDATE_CSV_CONSISTENCY:
            features.append("一致性验证")
        if GENERATE_REPORT:
            features.append("生成报告")
        if ESTIMATE_PROCESSING_TIME:
            features.append("时间估算")
        if AUTO_CLEANUP_TEMP:
            features.append("自动清理")
        if PRE_UPLOAD_NETWORK_CHECK:
            features.append("网络检查")

        print(f"   启用: {', '.join(features) if features else '无额外功能'}")

        print(f"\n🌐 网络配置:")
        print(f"   最大重试次数: {NETWORK_MAX_RETRIES}")
        print(f"   连接超时: {CONNECTION_TIMEOUT}秒")
        print(f"   使用代理: {USE_PROXY}")
        if PRE_UPLOAD_NETWORK_CHECK:
            print(f"   上传前检查: 启用")
